package com.coder.rental.utils;

import com.coder.rental.entity.Permission;
import com.coder.rental.vo.RouteVo;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * 路由树构建工具类
 */
public class RouteTreeUtils {
    /**
     * 根据权限列表构建路由树结构
     *
     * @param permissionList 权限列表，用于构建路由树的原始数据
     * @param pid 父级权限ID，用于筛选指定父级下的子权限
     * @return 构建好的路由树结构列表
     */
    public static List<RouteVo> buildRouteTree(List<Permission> permissionList,int pid) {
        List<RouteVo> routeVoList = new ArrayList<>();
        // 过滤出指定父级ID的权限并构建路由树
        Optional.ofNullable(permissionList).orElse(new ArrayList<>())
                .stream()
                .filter(permission -> permission != null && permission.getPid() == pid)
                .forEach(permission -> {
                            RouteVo routeVo = new RouteVo();
                            routeVo.setPath(permission.getRoutePath());
                            routeVo.setName(permission.getRouteName());
                            // 根据父级ID设置不同的组件类型
                            if (permission.getPid() == 0) {
                                routeVo.setComponent("Layout");
                                routeVo.setAlwaysShow(true);
                            } else {
                                routeVo.setComponent(permission.getRouteUrl());
                            }
                            routeVo.setMeta(routeVo.new Meta(permission.getPermissionLabel(),
                                    permission.getIcon(),
                                    permission.getPermissionCode().split(",")));
                            // 递归构建子级路由树
                            List<RouteVo> children = buildRouteTree(permissionList, permission.getId());
                            routeVo.setChildren(children);
                            routeVoList.add(routeVo);
                        }
                );
        return routeVoList;
    }
    /**
     * 构建菜单树结构
     * 该函数通过递归方式将扁平化的权限列表转换为具有层级关系的树形结构
     *
     * @param list 权限列表，包含所有需要构建树形结构的权限数据
     * @param pid 父级权限ID，用于筛选当前层级的子权限
     * @return 返回以pid为父级的所有子权限构成的树形结构列表
     */
    public static List<Permission> buildMenuTree(List<Permission> list,int pid){
        List<Permission> menuList = new ArrayList<>();
        Optional.ofNullable(list).orElse(new ArrayList<>())
                .stream()
                .filter(permission -> permission != null
                        && permission.getPid() == pid)
                .forEach(permission -> {
                    Permission menu = new Permission();
                    BeanUtils.copyProperties(permission,menu);
                    menu.setChildren(buildMenuTree(list,permission.getId()));
                    menuList.add(menu);
                });
        return menuList;
    }

}

